import numpy as np
import win32gui, win32ui, win32con, win32api
import cv2

hwnd_title = dict()


def gran_screen_win32(grab_rect=None):
    hwnd = 0  # 窗口的编号，0号表示当前活跃窗口

    # 根据窗口句柄获取窗口的设备上下文DC（Divice Context）
    hwndDC = win32gui.GetWindowDC(hwnd)
    # 根据窗口的DC获取mfcDC
    mfcDC = win32ui.CreateDCFromHandle(hwndDC)
    # mfcDC创建可兼容的DC
    saveDC = mfcDC.CreateCompatibleDC()
    # 创建bigmap准备保存图片
    saveBitMap = win32ui.CreateBitmap()
    x, y, w, h = (0, 0, 100, 100)

    if grab_rect is None:
        # 获取监控器信息
        MoniterDev = win32api.EnumDisplayMonitors(None, None)
        w = MoniterDev[0][2][2]
        h = MoniterDev[0][2][3]
        # print w,h　　　#图片大小
        # 为bitmap开辟空间
        saveBitMap.CreateCompatibleBitmap(mfcDC, w, h)
        # 高度saveDC，将截图保存到saveBitmap中
        saveDC.SelectObject(saveBitMap)

    else:
        x, y, w, h = grab_rect
        # 为bitmap开辟空间
        saveBitMap.CreateCompatibleBitmap(mfcDC, w, h)
        # 高度saveDC，将截图保存到saveBitmap中
        saveDC.SelectObject(saveBitMap)
        # 截取从左上角（0，0）长宽为（w，h）的图片

    saveDC.BitBlt((0, 0), (w, h), mfcDC, (x, y), win32con.SRCCOPY)
    signed_ints_array = saveBitMap.GetBitmapBits(True)
    img = np.frombuffer(signed_ints_array, dtype="uint8")
    img.shape = (h, w, 4)
    img = cv2.cvtColor(img, cv2.COLOR_RGBA2RGB)

    win32gui.DeleteObject(saveBitMap.GetHandle())
    mfcDC.DeleteDC()
    saveDC.DeleteDC()

    return img


# 窗口大小
windows_size = (1920, 1080)

# 截图大小
screen_size = (320, 320)

shot_size = (int((windows_size[0] / 2) - (screen_size[0] / 2)), int((windows_size[1] / 2) - (screen_size[1] / 2)),
             screen_size[0], screen_size[1])

# 截图
img = gran_screen_win32((0, 0, 1920, 1080))

# cv2.imwrite("./11.jpg", img)
